package com.xjh.basestudy.designmode.behaviorMode.behaviorMode3_ChainOfResponsibility.p2_chain;

/**
 * @Author XuJianHua
 * @Date 2022/10/4 14:44
 * @Description
 *
 *
 * 责任链模式的其中一种应用场景 ，
 * 1.链式调用（handler实现类中指定下一个handler实现类）(同案例)
 * 2. 即手动add到ArrayList中，然后for循环调用，除此之外，
 */
public class Client {

    public static void main(String[] args) {

        // 创建审批专员张飞，当传入参数9000时，张飞走false，执行this.nextApprover.approve(amount); 此时执行的是关羽的审批方法，this.nextApprover为什么会是关羽呢？
        // 答案： 因为在张飞的setNextApprover方法里写了this.nextApprover = nextApprover;已经设置好了张飞的下一位审批人，
        // 那么 return this.nextApprover;是干什么用呢?
        // 答案：为了实现链式编程，调用setNextApprover后需要返回一个Approvaer类型的对象。然后再递归调用setNextApprover方法。
        Approver flightJohn = new Staff("张飞");
        //此处使用链式编程配置责任链
        flightJohn.setNextApprover(new Manager("关羽")).setNextApprover(new CFO("刘备"));

        //直接找专员张飞审批
        flightJohn.approve(1000);
        /***********************
         审批通过。【专员：张飞】
         ***********************/

        flightJohn.approve(4000);
        /***********************
         无权审批，升级处理。【专员：张飞】
         审批通过。【经理：关羽】
         ***********************/

        flightJohn.approve(9000);
        /***********************
         无权审批，升级处理。【专员：张飞】
         无权审批，升级处理。【经理：关羽】
         审批通过。【CEO：刘备】
         ***********************/

        flightJohn.approve(88000);
        /***********************
         无权审批，升级处理。【专员：张飞】
         无权审批，升级处理。【经理：关羽】
         驳回申请。【CEO：刘备】
         ***********************/
    }

}
